<?php

namespace Backoffice\Controller;

use Zend\View\Model\ViewModel;
use Zend\Mvc\Controller\AbstractActionController;

class UtilisateurController extends AbstractActionController
{
    /**
    * Entity manager instance
    *
    * @var Doctrine\ORM\EntityManager
    */
    protected $em;

    /**
    * Returns an instance of the Doctrine entity manager loaded from the service
    * locator
    *
    * @return Doctrine\ORM\EntityManager
    */
    
    public function getEntityManager()
    {
        if (null === $this->em) {
            $this->em = $this->getServiceLocator()
                ->get('doctrine.entitymanager.orm_default');
        }
        return $this->em;
    }
    
    /**
     * Delete all entities given in arguments
     */
    public function removeEntities()
    {
        $em = $this->getEntityManager();
        $args = func_get_args();
        foreach ($args as $arg) {
            foreach ($arg as $entity) {
                $em->remove($entity);
            }
        }
        $em->flush();
    }
    
    public function indexAction()
    {
        return new ViewModel(
            array(
                'utilisateurs' => $this->getEntityManager()->getRepository('Backoffice\Model\Entity\Utilisateur')->findAll()
            )
        );
    }

    public function deleteAction()
    {
        $error = null;
        $id = (int) $this->params()->fromRoute('id', 0);
        if (!$id) {
            return $this->redirect()->toRoute('utilisateur');
        }
        
        $em = $this->getEntityManager();
        $utilisateur = $em->find('Backoffice\Model\Entity\Utilisateur', $id);
        $request = $this->getRequest();

        if ($request->isPost()) {
            $del = $request->getPost('del', 'No');
            if ($del == 'Yes') {
                if ($utilisateur) {
                    
                    $boutique = $em->find('Backoffice\Model\Entity\Boutique', $utilisateur->getBoutique()->getId());
                    
                    // 1a) Pour pouvoir supprimer l'utilisateur, il faut d'abord supprimer :
                    // les annonces crées par l'utilisateur
                    // les commentaires créés par l'utilisateur
                    // les messages envoyés par l'utilisateur
                    // les messages recus par l'utilisateur
                    // les produits vendus à cet utilisateur
                    // les enchères créées par l'utilisateur
                    $annonces = $em->getRepository('Backoffice\Model\Entity\Annonce')
                        ->findBy(array('utilisateur' => $utilisateur));
                    $commentaires = $em->getRepository('Backoffice\Model\Entity\Commentaire')
                        ->findBy(array('utilisateur' => $utilisateur));
                    $messagesEnvoyes = $em->getRepository('Backoffice\Model\Entity\Message')
                        ->findBy(array('expediteur' => $utilisateur));
                    $messagesRecus = $em->getRepository('Backoffice\Model\Entity\Message')
                        ->findBy(array('destinataire' => $utilisateur));
                    $produitsVendus = $em->getRepository('Backoffice\Model\Entity\ProduitVendu')
                        ->findBy(array('utilisateur' => $utilisateur));
                    $encheres = $em->getRepository('Backoffice\Model\Entity\Enchere')
                        ->findBy(array('utilisateur' => $utilisateur));
                    $this->removeEntities($annonces, $commentaires, $messagesEnvoyes, $messagesRecus, $produitsVendus, $encheres);
                    
                    // 1b) On peut maintenant supprimer l'utilisateur
                    $em->remove($utilisateur);
                    $em->flush();
                    
                    // 2a) Pour pouvoir supprimer la boutique de l'utilisateur, il faut d'abord supprimer :
                    // Les commentaires qui ont été créés sur cette boutique
                    // Les produits de la boutique de l'utilisateur (il faut supprimer leurs encheres avant)
                    // Les produits vendus par la boutique de l'utilisateur
                    $commentairesBoutique = $em->getRepository('Backoffice\Model\Entity\Commentaire')
                        ->findBy(array('boutique' => $boutique));
                    
                    $produitsBoutique = $em->getRepository('Backoffice\Model\Entity\Produit')
                        ->findBy(array('boutique' => $boutique));
                    
                    $encheresProduitsBoutique = array();
                    foreach ($produitsBoutique as $produit) {
                        $encheres = $em->getRepository('Backoffice\Model\Entity\Enchere')
                            ->findBy(array('produit' => $produit));
                        foreach ($encheres as $entity) {
                            $encheresProduitsBoutique[] = $entity;
                        }
                    }
                    
                    $produitsVendusBoutique = $em->getRepository('Backoffice\Model\Entity\ProduitVendu')
                        ->findBy(array('boutique' => $boutique));
                    
                    $this->removeEntities($commentairesBoutique, $encheresProduitsBoutique, $produitsBoutique, $produitsVendusBoutique);
                    
                    // 2b) On peut maintenant supprimer la boutique de l'utilisateur
                    $em->remove($boutique);
                    $em->flush();
                }
            }

            // Redirect to list of utilisateurs
            return $this->redirect()->toRoute('utilisateur');
        }
        
        if (is_null($utilisateur)) {
            $error = "L'utilisateur numero $id n'existe pas !";
        }

        return array(
            'id'    => $id,
            'utilisateur' => $utilisateur,
            'error' => $error,
        );
    }

}

